class Solution {
public:
    /*
    思路：
        要想知道两个气球能不能被一支箭引爆，首先需要知道的就是两个气球的 
        左边界和右边界，看当前气球的左边界是不是小于等于上个气球的右边界
        当然，有可能一支箭可以引爆两个以上的气球，所以我们需要一个变量来
        确定两个或多个气球可以被引爆的最大的右边界，这里设该变量为right
        其次，如果按照左右边界来思考本问题，那我们的气球的左右边界需要按
        照左边界小的顺序排序。 类似{1,4}{2,3} {5,8} {5,6} {7,8}
        而且由于 {5,8} {5,6} {7,8} 和 {5,6} {5,8} {7,8}引爆的箭数并无
        区别，所以我们也不需要针对右边界做大小处理

    */
    static bool cmp(vector<int>&a, vector<int>&b)
    {
        return a[0]<b[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) 
    {
        if(points.size()==0) return 0;
        int res=1;//只要有气球，最少需要一支箭
        sort(points.begin(),points.end(),cmp);

        //右边界 用来确定两个或多个气球能不能被同时引爆
        int right=points[0][1];
        for(int i=1;i<points.size();i++)
        {
            //当前气球的左边界 大于上个气球个右边界 
            //这两个气球一定不能使用同一支箭
            if(points[i][0]>right)
            {
                res++;
                right=points[i][1];
            }
            else
            {
                right=min(points[i][1],right);
            }
        }
        return res;
    }
};